package org.gap.service;

import java.util.Calendar;
import java.util.List;
import java.util.Set;

import org.gap.dao.AdressesTiersDAO;
import org.gap.dao.UtilisateursDAO;

import org.gap.domain.AdressesTiers;
import org.gap.domain.Utilisateurs;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for AdressesTiers entities
 * 
 */

@Service("AdressesTiersService")
@Transactional
public class AdressesTiersServiceImpl implements AdressesTiersService {

	/**
	 * DAO injected by Spring that manages AdressesTiers entities
	 * 
	 */
	@Autowired
	private AdressesTiersDAO adressesTiersDAO;

	/**
	 * DAO injected by Spring that manages Utilisateurs entities
	 * 
	 */
	@Autowired
	private UtilisateursDAO utilisateursDAO;

	/**
	 * Instantiates a new AdressesTiersServiceImpl.
	 *
	 */
	public AdressesTiersServiceImpl() {
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public AdressesTiers deleteAdressesTiersUtilisateursByAdtUserCreation(Integer adressestiers_adtAdresse, Integer adressestiers_adtTiers, String adressestiers_adtTypeAdresse, String adressestiers_adtEtatAffectation, Calendar adressestiers_adtFinAffectation, String related_utilisateursbyadtusercreation_usrUser) {
		AdressesTiers adressestiers = adressesTiersDAO.findAdressesTiersByPrimaryKey(adressestiers_adtAdresse, adressestiers_adtTiers, adressestiers_adtTypeAdresse, adressestiers_adtEtatAffectation, adressestiers_adtFinAffectation, -1, -1);
		Utilisateurs related_utilisateursbyadtusercreation = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyadtusercreation_usrUser, -1, -1);

		adressestiers.setUtilisateursByAdtUserCreation(null);
		related_utilisateursbyadtusercreation.getAdressesTiersesForAdtUserCreation().remove(adressestiers);
		adressestiers = adressesTiersDAO.store(adressestiers);
		adressesTiersDAO.flush();

		related_utilisateursbyadtusercreation = utilisateursDAO.store(related_utilisateursbyadtusercreation);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateursbyadtusercreation);
		utilisateursDAO.flush();

		return adressestiers;
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public AdressesTiers saveAdressesTiersUtilisateursByAdtUserModification(Integer adtAdresse, Integer adtTiers, String adtTypeAdresse, String adtEtatAffectation, Calendar adtFinAffectation, Utilisateurs related_utilisateursbyadtusermodification) {
		AdressesTiers adressestiers = adressesTiersDAO.findAdressesTiersByPrimaryKey(adtAdresse, adtTiers, adtTypeAdresse, adtEtatAffectation, adtFinAffectation, -1, -1);
		Utilisateurs existingutilisateursByAdtUserModification = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyadtusermodification.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateursByAdtUserModification != null) {
			existingutilisateursByAdtUserModification.setUsrUser(related_utilisateursbyadtusermodification.getUsrUser());
			existingutilisateursByAdtUserModification.setUsrPassword(related_utilisateursbyadtusermodification.getUsrPassword());
			existingutilisateursByAdtUserModification.setUsrService(related_utilisateursbyadtusermodification.getUsrService());
			existingutilisateursByAdtUserModification.setUsrMail(related_utilisateursbyadtusermodification.getUsrMail());
			existingutilisateursByAdtUserModification.setUsrEnabled(related_utilisateursbyadtusermodification.getUsrEnabled());
			related_utilisateursbyadtusermodification = existingutilisateursByAdtUserModification;
		} else {
			related_utilisateursbyadtusermodification = utilisateursDAO.store(related_utilisateursbyadtusermodification);
			utilisateursDAO.flush();
		}

		adressestiers.setUtilisateursByAdtUserModification(related_utilisateursbyadtusermodification);
		related_utilisateursbyadtusermodification.getAdressesTiersesForAdtUserModification().add(adressestiers);
		adressestiers = adressesTiersDAO.store(adressestiers);
		adressesTiersDAO.flush();

		related_utilisateursbyadtusermodification = utilisateursDAO.store(related_utilisateursbyadtusermodification);
		utilisateursDAO.flush();

		return adressestiers;
	}

	/**
	 * Delete an existing AdressesTiers entity
	 * 
	 */
	@Transactional
	public void deleteAdressesTiers(AdressesTiers adressestiers) {
		adressesTiersDAO.remove(adressestiers);
		adressesTiersDAO.flush();
	}

	/**
	 * Return all AdressesTiers entity
	 * 
	 */
	@Transactional
	public List<AdressesTiers> findAllAdressesTierss(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<AdressesTiers>(adressesTiersDAO.findAllAdressesTierss(startResult, maxRows));
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public AdressesTiers saveAdressesTiersUtilisateursByAdtUserCreation(Integer adtAdresse, Integer adtTiers, String adtTypeAdresse, String adtEtatAffectation, Calendar adtFinAffectation, Utilisateurs related_utilisateursbyadtusercreation) {
		AdressesTiers adressestiers = adressesTiersDAO.findAdressesTiersByPrimaryKey(adtAdresse, adtTiers, adtTypeAdresse, adtEtatAffectation, adtFinAffectation, -1, -1);
		Utilisateurs existingutilisateursByAdtUserCreation = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyadtusercreation.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateursByAdtUserCreation != null) {
			existingutilisateursByAdtUserCreation.setUsrUser(related_utilisateursbyadtusercreation.getUsrUser());
			existingutilisateursByAdtUserCreation.setUsrPassword(related_utilisateursbyadtusercreation.getUsrPassword());
			existingutilisateursByAdtUserCreation.setUsrService(related_utilisateursbyadtusercreation.getUsrService());
			existingutilisateursByAdtUserCreation.setUsrMail(related_utilisateursbyadtusercreation.getUsrMail());
			existingutilisateursByAdtUserCreation.setUsrEnabled(related_utilisateursbyadtusercreation.getUsrEnabled());
			related_utilisateursbyadtusercreation = existingutilisateursByAdtUserCreation;
		} else {
			related_utilisateursbyadtusercreation = utilisateursDAO.store(related_utilisateursbyadtusercreation);
			utilisateursDAO.flush();
		}

		adressestiers.setUtilisateursByAdtUserCreation(related_utilisateursbyadtusercreation);
		related_utilisateursbyadtusercreation.getAdressesTiersesForAdtUserCreation().add(adressestiers);
		adressestiers = adressesTiersDAO.store(adressestiers);
		adressesTiersDAO.flush();

		related_utilisateursbyadtusercreation = utilisateursDAO.store(related_utilisateursbyadtusercreation);
		utilisateursDAO.flush();

		return adressestiers;
	}

	/**
	 * Load an existing AdressesTiers entity
	 * 
	 */
	@Transactional
	public Set<AdressesTiers> loadAdressesTierss() {
		return adressesTiersDAO.findAllAdressesTierss();
	}

	/**
	 */
	@Transactional
	public AdressesTiers findAdressesTiersByPrimaryKey(Integer adtAdresse, Integer adtTiers, String adtTypeAdresse, String adtEtatAffectation, Calendar adtFinAffectation) {
		return adressesTiersDAO.findAdressesTiersByPrimaryKey(adtAdresse, adtTiers, adtTypeAdresse, adtEtatAffectation, adtFinAffectation);
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public AdressesTiers deleteAdressesTiersUtilisateursByAdtUserModification(Integer adressestiers_adtAdresse, Integer adressestiers_adtTiers, String adressestiers_adtTypeAdresse, String adressestiers_adtEtatAffectation, Calendar adressestiers_adtFinAffectation, String related_utilisateursbyadtusermodification_usrUser) {
		AdressesTiers adressestiers = adressesTiersDAO.findAdressesTiersByPrimaryKey(adressestiers_adtAdresse, adressestiers_adtTiers, adressestiers_adtTypeAdresse, adressestiers_adtEtatAffectation, adressestiers_adtFinAffectation, -1, -1);
		Utilisateurs related_utilisateursbyadtusermodification = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateursbyadtusermodification_usrUser, -1, -1);

		adressestiers.setUtilisateursByAdtUserModification(null);
		related_utilisateursbyadtusermodification.getAdressesTiersesForAdtUserModification().remove(adressestiers);
		adressestiers = adressesTiersDAO.store(adressestiers);
		adressesTiersDAO.flush();

		related_utilisateursbyadtusermodification = utilisateursDAO.store(related_utilisateursbyadtusermodification);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateursbyadtusermodification);
		utilisateursDAO.flush();

		return adressestiers;
	}

	/**
	 * Save an existing AdressesTiers entity
	 * 
	 */
	@Transactional
	public void saveAdressesTiers(AdressesTiers adressestiers) {
		AdressesTiers existingAdressesTiers = adressesTiersDAO.findAdressesTiersByPrimaryKey(adressestiers.getAdtAdresse(), adressestiers.getAdtTiers(), adressestiers.getAdtTypeAdresse(), adressestiers.getAdtEtatAffectation(), adressestiers.getAdtFinAffectation());

		if (existingAdressesTiers != null) {
			if (existingAdressesTiers != adressestiers) {
				existingAdressesTiers.setAdtAdresse(adressestiers.getAdtAdresse());
				existingAdressesTiers.setAdtTiers(adressestiers.getAdtTiers());
				existingAdressesTiers.setAdtTypeAdresse(adressestiers.getAdtTypeAdresse());
				existingAdressesTiers.setAdtEtatAffectation(adressestiers.getAdtEtatAffectation());
				existingAdressesTiers.setAdtFinAffectation(adressestiers.getAdtFinAffectation());
				existingAdressesTiers.setAdtDateCreation(adressestiers.getAdtDateCreation());
				existingAdressesTiers.setAdtDateModification(adressestiers.getAdtDateModification());
			}
			adressestiers = adressesTiersDAO.store(existingAdressesTiers);
		} else {
			adressestiers = adressesTiersDAO.store(adressestiers);
		}
		adressesTiersDAO.flush();
	}

	/**
	 * Return a count of all AdressesTiers entity
	 * 
	 */
	@Transactional
	public Integer countAdressesTierss() {
		return ((Long) adressesTiersDAO.createQuerySingleResult("select count(*) from AdressesTiers o").getSingleResult()).intValue();
	}
}
